package com.adil.base.collections.list;

import java.util.LinkedList;

/**
 * @description: Java LinkedList 示例
 * @author: Adil
 * @date: 2024/4/24
 * @URL: https://www.runoob.com/java/java-linkedlist.html
 */
public class LinkedListDemo {
    public static void main(String[] args) {
        // 说明LinkedList的特点
        // 1.LinkedList是双向链表，可以从头部和尾部双向遍历，效率高于ArrayList
        // 2.LinkedList可以动态增长，ArrayList大小是固定的
        // 3.LinkedList可以快速定位元素，ArrayList需要遍历整个数组才能定位元素
        // 4.LinkedList不允许null元素，ArrayList允许null元素
        // 5.LinkedList线程不安全，ArrayList线程安全
        // 6.LinkedList的迭代器是fail-fast的，ArrayList的迭代器是fast-fail的
        // 7.LinkedList的查询操作时间复杂度是O(n)，ArrayList的查询操作时间复杂度是O(1)
        // 8.LinkedList的增删操作时间复杂度是O(1)，ArrayList的增删操作时间复杂度是O(n)
        // 9.LinkedList的空间复杂度是O(n)，ArrayList的空间复杂度是O(n)
        // 10.LinkedList的内存占用比ArrayList小，ArrayList的内存占用比LinkedList大
        // 11.LinkedList的源码比ArrayList更复杂，但是功能更强大，适合用于开发高并发、高性能的系统
        // 12.LinkedList的使用场景是List的实现类，ArrayList的使用场景是数组的实现类
        // linkedList的使用场景是List的实现类，ArrayList的使用场景是数组的实现类
        // 13.LinkedList的源码比ArrayList更复杂，但是功能更强大，适合用于开发高并发、高性能的系统
        // 什么是双向链表？
        // 双向链表是指链表中的每个节点都有两个指针，一个指向前一个节点，另一个指向后一个节点。
        // 双向链表可以从头部和尾部双向遍历，效率高于单向链表。
        // 双向链表可以动态增长，ArrayList大小是固定的。
        // 常用方法：
        // add(E e)：在链表的尾部添加元素
        // addFirst(E e)：在链表的头部添加元素
        // addLast(E e)：在链表的尾部添加元素
        // add(int index, E element)：在指定位置添加元素
        // get(int index)：获取指定位置的元素
        // set(int index, E element)：设置指定位置的元素的值
        // remove(int index)：删除指定位置的元素
        // removeFirst()：删除链表的第一个元素
        // removeLast()：删除链表的最后一个元素
        // contains(Object o)：判断链表中是否包含指定元素
        // size()：获取链表的长度
        // isEmpty()：判断链表是否为空
        // indexOf(Object o)：获取指定元素在链表中的索引
        // lastIndexOf(Object o)：获取指定元素在链表中的最后一个索引
        // clear()：清空链表
        // clone()：克隆链表
        // subList(int fromIndex, int toIndex)：获取子链表
        // listIterator()：返回一个ListIterator，用于遍历链表
        // iterator()：返回一个Iterator，用于遍历链表
        // 注意：
        // 1.LinkedList的增删操作时间复杂度是O(1)，ArrayList的增删操作时间复杂度是O(n)
        // 2.LinkedList的查询操作时间复杂度是O(n)，ArrayList的查询操作时间复杂度是O(1)
        // 3.LinkedList的空间复杂度是O(n)，ArrayList的空间复杂度是O(n)
        // 4.LinkedList的内存占用比ArrayList小，ArrayList的内存占用比LinkedList大
        // 5.LinkedList的源码比ArrayList更复杂，但是功能更强大，适合用于开发高并发、高性能的系统
        // 6.LinkedList的使用场景是List的实现类，ArrayList的使用场景是数组的实现类
        // 7.LinkedList的源码比ArrayList更复杂，但是功能更强大，适合用于开发高并发、高性能的系统
        // 8.LinkedList的线程不安全，ArrayList线程安全
        // 9.LinkedList的迭代器是fail-fast的，ArrayList的迭代器是fast-fail的
        // 10.LinkedList的查询操作时间复杂度是O(n)，ArrayList的查询操作时间复杂度是O(1)
        // 11.LinkedList的增删操作时间复杂度是O(1)，ArrayList的增删操作时间复杂度是O(n)
        // 12.LinkedList的空间复杂度是O(n)，ArrayList的空间复杂度是O(n)
        // 13.LinkedList的内存占用比ArrayList小，ArrayList的内存占用比LinkedList大
        // 14.LinkedList的源码比ArrayList更复杂，但是功能更强大，适合用于开发高并发、高性能的系统
        // 15.LinkedList的使用场景是List的实现类，ArrayList的使用场景是数组的实现类
        // 16.LinkedList的源码比ArrayList更复杂，但是功能更强大，适合用于开发高并发、高性能的系统
        // 17.LinkedList的线程不安全，ArrayList线程安全
        // 18.LinkedList的迭代器是fail-fast的，ArrayList的迭代器是fast-fail的
        // 19.LinkedList的查询操作时间复杂度是O(n)，ArrayList的查询操作时间复杂度是O(1)
        // 20.LinkedList的增删操作时间复杂度是O(1)，ArrayList的增删操作时间复杂度是O(n)
        // 21.LinkedList的空间复杂度是O(n)，ArrayList的空间复杂度是O(n)
        // 22.LinkedList的内存占用比ArrayList小，ArrayList的内存占用比LinkedList大
    }
}
